#  需要统一对Excel 去进行处理
import ast
import json
import os.path

import pandas
import yaml

from core.globalContext import Global_Context


#  把excel的格式处理成我们规定的格式
def excel_case_parser(config_path):
    """
    :param config_path: 文件的路径
    :return: {
            "case_names": case_names   #  所有测试用例对应的标题 []
            "case_infos": case_infos,  #  所有的测试用例 []
    }
    """
    # TODO 0: 对应固定的格式
    case_names = []
    case_infos = []
    # TODO 1: 调用对应的方法：拿到所有的用例数据
    excel_caseinfos = load_excel_files(config_path)

    # TODO 2: 统一处理成一样的格式 （后面excel一样的处理）
    for caseinfo in excel_caseinfos:
        caseinfo.update({"_case_name": caseinfo["desc"]})
        case_infos.append(caseinfo)  # 所有的测试用例 []
        case_names.append(caseinfo["desc"])  # 所有的用例名称 []

    return {
        "case_infos": case_infos,
        "case_names": case_names
    }


def load_context_from_excel(folder_path):
    """

    :param folder_path: 文件路径
    :return:
    """

    try:
        excel_file_path = os.path.join(folder_path, "context.xlsx")
        excel_data = pandas.read_excel(excel_file_path)
        # 初始化一个变量进行存储
        data = {
            "_database": {}
        }
        for index, row in excel_data.iterrows():
            # 如果是变量我们就直接存储：变量名：value
            if row["类型"] == "变量":
                data[row["变量描述"]] = row["变量值"]
            elif row["类型"] == "数据库":
                db_name = row["变量描述"]
                # str格式转字典格式
                db_config = json.loads(row["变量值"])
                data["_database"][db_name] = db_config

            # 写入到全局变量
            if data:
                Global_Context().set_by_dict(data)
    except Exception as e:

        print(f"装载excel文件错误: {str(e)}")
        return False


def load_excel_files(config_path):
    """
    返回满足条件的excel文件列表及数据
    :param config_path: excel存放的路径
    :return:
    """

    # 存储所有的数据
    excel_caseinfos = []

    suite_folder = os.path.join(config_path)
    # 存放在该路径的全局变量进行写入
    load_context_from_excel(suite_folder)
    # load_context_from api235.day12.apirun._excel(config_path)

    # 满足条件的列表
    files_name = [(int(file.split("_")[0]), file) for file in os.listdir(config_path)
                  if file.split("_")[0].isdigit() and file.endswith(".xlsx")]

    # 排序，排序只保留文件名即可
    files_name.sort()
    files_name = [file[-1] for file in files_name]

    # 读取我们维护的yaml数据，方便后面和值一一对应起来
    # 获取当前文件的绝对路径
    current_dir = os.path.abspath(os.path.dirname(__file__))
    # 基于当前路径获取上一层路径
    parent_dir = os.path.dirname(current_dir)
    keywords_file_path = os.path.join(parent_dir, "extend\keywords.yaml")

    keywords_info = {}
    with open(keywords_file_path, "r", encoding="utf-8") as file:
        keywords_info = yaml.full_load(file)

    # 加载每个文件的数据给到yaml_caseInfos
    for file_name in files_name:
        file_path = os.path.join(config_path, file_name)
        # TODO 1: 读取excel
        excel_data = pandas.read_excel(file_path, sheet_name=0)
        # 将非空值保留，空数据用None替换
        excel_data = excel_data.where(excel_data.notnull(), None)
        # 以字典的格式给我显示
        excel_data = excel_data.to_dict(orient="records")

        # 初始化一个字典，用例存放某一条测试用例
        current_test_case = None

        for row in excel_data:
            # 判断是否有测试标题：如果有的话，代表是一个用例，直到遇到下一个标题，就从头开头
            # TODO 1: # 检查当前行是否包含有效的测试用例标题，有则代表对应的起始位
            if pandas.notna(row["测试用例标题"]):
                if current_test_case is not None:
                    excel_caseinfos.append(current_test_case)

                # 初始化一个测试用例字典
                current_test_case = {
                    "desc": row["测试用例标题"],
                    "steps": []
                }

            # TODO 2-1: 初始化步骤的值
            steps = {
                row["步骤描述"]: {
                    "关键字": row["关键字"]
                }
            }

            # TODO 2-2: 考虑步骤当中对应的每个参数。
            parameter = []
            for key, value in row.items():
                if "参数_" in key:
                    try:
                        # 尝试将字符串转换为Python对象
                        value = ast.literal_eval(value)
                    except:
                        pass

                    parameter.append(value)

            # TODO 2-3: 把对应的值和KEY一一对应起来，这样我们才能发送请求 -zip
            # dict_parameter = {k,v  for k,v in zip(key,value)}
            dict_parameter = {key: value for key, value in zip(keywords_info[row["关键字"]], parameter)}
            steps[row["步骤描述"]].update(dict_parameter)

            # 步骤加到当前测试用例来
            current_test_case["steps"].append(steps)

        if current_test_case is not None:
            excel_caseinfos.append(current_test_case)

    return excel_caseinfos


print(load_excel_files(r"F:\pythonCode\api_project_class\api235\day09\apirun_2\data"))
